package com.example.onlineanswer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.onlineanswer.model.entity.Contest;
import com.example.onlineanswer.model.vo.ContestAnswerVO;
import com.example.onlineanswer.model.vo.ContestVO;

/**
 * 竞赛服务接口
 */
public interface ContestService extends IService<Contest> {

    /**
     * 分页查询竞赛列表
     *
     * @param page          分页参数
     * @param status        状态（可选）
     * @param excludeStatus 排除的状态（可选）
     * @param keyword       关键词（可选）
     * @param creatorId     创建者ID（可选）
     * @return 竞赛列表
     */
    IPage<ContestVO> pageContestList(Page<ContestVO> page, Integer status, Integer excludeStatus, String keyword, Long creatorId);

    /**
     * 根据ID获取竞赛详情
     *
     * @param id 竞赛ID
     * @return 竞赛详情
     */
    ContestVO getContestDetailById(Long id);

    /**
     * 创建竞赛
     *
     * @param contest 竞赛信息
     * @return 竞赛ID
     */
    Long createContest(Contest contest);

    /**
     * 更新竞赛信息
     *
     * @param contest 竞赛信息
     * @return 是否成功
     */
    boolean updateContest(Contest contest);

    /**
     * 审核竞赛
     *
     * @param id        竞赛ID
     * @param status    审核状态
     * @param reviewerId 审核人ID
     * @return 是否成功
     */
    boolean reviewContest(Long id, Integer status, Long reviewerId);

    /**
     * 删除竞赛
     *
     * @param id 竞赛ID
     * @return 是否成功
     */
    boolean deleteContest(Long id);

    /**
     * 开始竞赛
     *
     * @param id 竞赛ID
     * @return 是否成功
     */
    boolean startContest(Long id);

    /**
     * 结束竞赛
     *
     * @param id 竞赛ID
     * @return 是否成功
     */
    boolean endContest(Long id);

    /**
     * 更新参与人数
     *
     * @param id            竞赛ID
     * @param incrementValue 增加的值
     * @return 是否成功
     */
    boolean updateParticipants(Long id, int incrementValue);

    /**
     * 更新当前题目ID
     *
     * @param id                竞赛ID
     * @param currentQuestionId 当前题目ID
     * @return 是否成功
     */
    boolean updateCurrentQuestionId(Long id, Long currentQuestionId);
    
    /**
     * 获取竞赛答题统计
     *
     * @param contestId 竞赛ID
     * @return 竞赛答题统计
     */
    ContestAnswerVO getContestAnswerStatistics(Long contestId);

    /**
     * 检查用户是否已参与竞赛
     *
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 是否已参与
     */
    boolean isUserJoined(Long contestId, Long userId);

    /**
     * 用户参与竞赛
     *
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean joinContest(Long contestId, Long userId);

    /**
     * 最终化竞赛结果，计算得分和排名
     * @param contestId 竞赛ID
     */
    void finalizeContestResults(Long contestId);
} 